import { observe } from "./index"

// 主要要做的事就是拦截用户调用push shift unshift pop reverse sort splice

// concat ...

// 先获取老的数组的方法  只改写这7个方法
let oldArrayProtoMethods = Array.prototype

// 拷贝的一个新的对象 可以查找到 老的方法
export let arrayMethods = Object.create(oldArrayProtoMethods)

// 原型链 prototype __proto__
let methods = [
  'push',
  'shift',
  'pop',
  'unshift',
  'reverse',
  'sort',
  'splice'
]

export function observerArray(inserted) { // 要循环数组一次对数组中每一项进行观察
  for(let i =0; i< inserted.length; i++) {
    observe(inserted[i]) // 没有 对数组的索引进行监控
  }
}

methods.forEach( method => { // [].push(1,2,3)
  arrayMethods[method] = function(...args) { // 函数劫持 切片编程
    // call apply bind 用法
    let r = oldArrayProtoMethods[method].apply(this, args)
    // todo
    let inserted;
    switch(method){
      case 'push':
      case 'unshift':
        inserted = args
        break;
      case 'splice':
        inserted = args.slice(2) // 获取splice 新增的内容
    }
    if(inserted) observerArray(inserted)
    console.log('调用了数组更新的方法了')
    return r
  }
})

